/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.view;

import br.jm.acionista.base.eao.EaoException;
import br.jm.acionista.entity.Modulo;
import br.jm.acionista.entity.Usuario;
import br.jm.acionista.entity.UsuarioModulo;
import br.jm.acionista.entity.UsuarioModuloPK;
import br.jm.acionista.filter.Funcoes;
import br.jm.acionista.sistema.eao.ModuloEao;
import br.jm.acionista.sistema.eao.UsuarioEao;
import br.jm.acionista.sistema.eao.UsuarioModuloEao;
import br.jm.acionista.sistema.eao.UsuarioModuloPKEao;
import java.io.Serializable;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.ValueChangeEvent;
import javax.persistence.EntityManager;
import org.primefaces.event.SelectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.LazyDataModel;
import org.primefaces.model.TreeNode;

/**
 *
 * @author joao
 */
public class UsuarioBean implements Serializable {

    private static final long serialVersionUID = 1L;
    private Usuario selectedUsuario;
    private LazyDataModel<Usuario> lazyModel;
    private UsuarioEao usuarioJpa;
    private Modulo selectedModulo;
    private ModuloEao moduloJpa;
    private List<Modulo> listModulo;
    private UsuarioModulo selectedUsuarioModulo;
    private UsuarioModuloPK selectedUsuarioModuloPK;
    private UsuarioModuloEao UsuarioModuloJpa;
    private UsuarioModuloPKEao UsuarioModuloPKJpa;
    private int nTotalReg;
    private EntityManager sessao;
    private String password1;
    private String password2;
    private boolean disable1;
    private boolean disable2;
    private boolean disableModulo;
    private boolean CheckModulo;
    private FacesMessage msg = null;
    private Funcoes funcoes = new Funcoes();
    private TreeNode root;
    private TreeNode selectedNode;
    private TreeNode[] selectedNodes;
    private String cSql;

    public UsuarioBean() {
        usuarioJpa = UsuarioEao.getInstance();
        selectedUsuario = new Usuario();

        selectedModulo = new Modulo();
        moduloJpa = ModuloEao.getInstance();
        listModulo = new ArrayList<Modulo>();

        selectedUsuarioModulo = new UsuarioModulo();
        selectedUsuarioModuloPK = new UsuarioModuloPK();
        UsuarioModuloJpa = UsuarioModuloEao.getInstance();
        UsuarioModuloPKJpa = UsuarioModuloPKEao.getInstance();

        try {
            listModulo = moduloJpa.getNative("Modulo", 0, moduloJpa.getCount("Modulo"), "numNivel", true, null, null, null);

            root = new DefaultTreeNode("Root", null);
            TreeNode node1 = null;
            TreeNode node12 = null;
            TreeNode node3 = null;
            TreeNode node34 = null;
            TreeNode node5 = null;
            TreeNode node56 = null;
            TreeNode node7 = null;
            TreeNode node78 = null;

            for (int i = 0; i < listModulo.size(); i++) {
                selectedModulo = listModulo.get(i);

                if (selectedModulo.getNumNivel() == 1) {
                    node1 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);
                } else if (selectedModulo.getNumNivel() == 2) {
                    node12 = new DefaultTreeNode(selectedModulo.getDscModulo(), node1);
                } else if (selectedModulo.getNumNivel() == 3) {
                    node3 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);
                } else if (selectedModulo.getNumNivel() == 4) {
                    node34 = new DefaultTreeNode(selectedModulo.getDscModulo(), node3);
                } else if (selectedModulo.getNumNivel() == 5) {
                    node5 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);
                } else if (selectedModulo.getNumNivel() == 6) {
                    node56 = new DefaultTreeNode(selectedModulo.getDscModulo(), node5);
                } else if (selectedModulo.getNumNivel() == 7) {
                    node7 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);
                } else if (selectedModulo.getNumNivel() == 8) {
                    node78 = new DefaultTreeNode(selectedModulo.getDscModulo(), node7);
                }

            }
        } catch (EaoException ex) {
            Logger.getLogger(UsuarioBean.class.getName()).log(Level.SEVERE, null, ex);
        }

        this.disable1 = false;
        this.disable2 = true;
        this.disableModulo = true;

        lazyModel = new LazyDataModel<Usuario>() {

            @Override
            public List<Usuario> load(int first, int pageSize, String sortField, boolean sortOrder, Map<String, String> filters) {

                List<Usuario> lazyUsuario = new ArrayList<Usuario>();

                try {
                    lazyUsuario = usuarioJpa.getNative("Usuario", first, pageSize, sortField, sortOrder, filters, null, null);
                } catch (Exception ex) {
                    Logger.getLogger(UsuarioBean.class.getName()).log(Level.SEVERE, null, ex);
                }

                if (lazyUsuario.isEmpty()) {
                    selectedUsuario = new Usuario();
                    selectedUsuario.setIdUsuario(0);
                    selectedUsuario.setNomUsuario("NENHUM REGISTRO RETORNADO ...");
                    lazyUsuario.add(selectedUsuario);
                }
                return lazyUsuario;
            }
        };

        nTotalReg = usuarioJpa.getCount("Usuario");
        if (nTotalReg == 0) {
            nTotalReg = 1;
            selectedUsuario = new Usuario();
        }
        lazyModel.setRowCount(nTotalReg);
    }

    public void inserir(ActionEvent actionEvent) throws EaoException {
        try {
            if (verifica_campos()) {
                this.sessao = usuarioJpa.openSessaoLote();
                usuarioJpa.openTransaction(this.sessao);

                selectedUsuario.setIdUsuario(null);
                usuarioJpa.create(selectedUsuario, "S", this.sessao);

                for (int i = 0; i < selectedNodes.length; i++) {
                    String cModulo = (String) selectedNodes[i].getData();
                    cSql = "from Modulo as o where o.dscModulo = '" + cModulo + "'";

                    listModulo = moduloJpa.get(cSql);
                    selectedModulo = listModulo.get(0);

                    selectedUsuarioModulo = new UsuarioModulo();
                    selectedUsuarioModuloPK = new UsuarioModuloPK();
                    selectedUsuarioModuloPK.setIdModulo(selectedModulo.getIdModulo());
                    selectedUsuarioModuloPK.setIdUsuario(selectedUsuario.getIdUsuario());

                    selectedUsuarioModulo.setModulo(selectedModulo);
                    selectedUsuarioModulo.setUsuario(selectedUsuario);
                    selectedUsuarioModulo.setUsuarioModuloPK(selectedUsuarioModuloPK);

                    UsuarioModuloJpa.create(selectedUsuarioModulo, "S", this.sessao);
                }

                usuarioJpa.closeTransaction(this.sessao);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuario Inserido com Sucesso ", selectedUsuario.getNomUsuario());
            }

        } catch (Exception e) {
            if (this.sessao.isOpen()) {
                usuarioJpa.closeSessao(this.sessao);
            }

            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Inserir" + selectedUsuario.getNomUsuario(),
                    e.getMessage());
        } finally {
            this.sessao = null;
            mostraButton(actionEvent);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void alterar(ActionEvent actionEvent) throws EaoException {
        try {
            if (verifica_campos()) {
                if (selectedUsuario.getIdUsuario() == 1) {
                    selectedUsuario.setTipStatus("Ativo");
                    selectedUsuario.setTipUsuario("Administrador");
                }
                this.sessao = usuarioJpa.openSessaoLote();
                usuarioJpa.openTransaction(this.sessao);

                cSql = "delete from usuario_modulo where id_usuario = ".concat(selectedUsuario.getIdUsuario().toString());
                UsuarioModuloJpa.executeUpdate(cSql, "S", this.sessao);

                usuarioJpa.edit(selectedUsuario, "S", this.sessao);

                for (int i = 0; i < selectedNodes.length; i++) {
                    String cModulo = (String) selectedNodes[i].getData();
                    cSql = "from Modulo as o where o.dscModulo = '" + cModulo + "'";

                    listModulo = moduloJpa.get(cSql);
                    selectedModulo = listModulo.get(0);

                    selectedUsuarioModulo = new UsuarioModulo();
                    selectedUsuarioModuloPK = new UsuarioModuloPK();
                    selectedUsuarioModuloPK.setIdModulo(selectedModulo.getIdModulo());
                    selectedUsuarioModuloPK.setIdUsuario(selectedUsuario.getIdUsuario());

                    selectedUsuarioModulo.setModulo(selectedModulo);
                    selectedUsuarioModulo.setUsuario(selectedUsuario);
                    selectedUsuarioModulo.setUsuarioModuloPK(selectedUsuarioModuloPK);

                    UsuarioModuloJpa.create(selectedUsuarioModulo, "S", this.sessao);
                }

                usuarioJpa.closeTransaction(this.sessao);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuario Alterado com Sucesso ", selectedUsuario.getNomUsuario());
            }
        } catch (Exception e) {
            if (this.sessao.isOpen()) {
                usuarioJpa.closeSessao(this.sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Alterar: " + selectedUsuario.getNomUsuario(),
                    e.getMessage());
        } finally {
            this.sessao = null;
            mostraButton(actionEvent);
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public void excluir(ActionEvent actionEvent) throws EaoException {
        try {
            if (selectedUsuario.getIdUsuario() == 1) {
                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "ATENÇÃO ... Esse Usuário não pode ser Excluido   USUÁRIO MASTER ", selectedUsuario.getNomUsuario());
            } else {
                this.sessao = usuarioJpa.openSessaoLote();
                usuarioJpa.openTransaction(this.sessao);

                cSql = "delete from usuario_modulo where id_usuario = ".concat(selectedUsuario.getIdUsuario().toString());
                UsuarioModuloJpa.executeUpdate(cSql, "S", this.sessao);

                usuarioJpa.destroy(selectedUsuario, "S", this.sessao);

                usuarioJpa.closeTransaction(this.sessao);

                msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Usuario Excluido com Sucesso ", selectedUsuario.getNomUsuario());
            }
        } catch (Exception e) {
            if (this.sessao.isOpen()) {
                usuarioJpa.closeSessao(this.sessao);
            }
            msg = new FacesMessage(FacesMessage.SEVERITY_WARN, "Erro ao Excluir: " + selectedUsuario.getNomUsuario(),
                    e.getMessage());
        } finally {
            this.sessao = null;
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
    }

    public LazyDataModel<Usuario> getLazyModel() {
        return lazyModel;
    }

    public void setLazyModel(LazyDataModel<Usuario> lazyModel) {
        this.lazyModel = lazyModel;
    }

    public Usuario getSelectedUsuario() {
        if (selectedUsuario == null) {
            selectedUsuario = new Usuario();
        }

        return selectedUsuario;
    }

    public void setSelectedUsuario(Usuario selectedUsuario) {
        this.disable1 = false;
        this.disable2 = true;

        if (selectedUsuario.getTipUsuario().equals("Usuário Normal")) {
            this.disableModulo = true;
        } else {
            this.disableModulo = false;
        }

        this.selectedUsuario = selectedUsuario;
    }

    public Usuario novo() {
        this.selectedUsuario = new Usuario();
        this.selectedUsuario.setIdUsuario(null);
        this.selectedUsuario.setDscEmail("");
        this.selectedUsuario.setNomUsuario("");
        this.selectedUsuario.setTipStatus("Ativo");
        this.selectedUsuario.setTipUsuario("Usuário Normal");

        this.disable1 = true;
        this.disable2 = false;
        this.disableModulo = true;

        try {
            listModulo = moduloJpa.getNative("Modulo", 0, moduloJpa.getCount("Modulo"), "numNivel", true, null, null, null);

            root = new DefaultTreeNode("Root", null);
            TreeNode node1 = null;
            TreeNode node12 = null;
            TreeNode node3 = null;
            TreeNode node34 = null;
            TreeNode node5 = null;
            TreeNode node56 = null;
            TreeNode node7 = null;
            TreeNode node78 = null;

            for (int i = 0; i < listModulo.size(); i++) {
                selectedModulo = listModulo.get(i);

                if (selectedModulo.getNumNivel() == 1) {
                    node1 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);
                } else if (selectedModulo.getNumNivel() == 2) {
                    node12 = new DefaultTreeNode(selectedModulo.getDscModulo(), node1);
                } else if (selectedModulo.getNumNivel() == 3) {
                    node3 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);
                } else if (selectedModulo.getNumNivel() == 4) {
                    node34 = new DefaultTreeNode(selectedModulo.getDscModulo(), node3);
                } else if (selectedModulo.getNumNivel() == 5) {
                    node5 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);
                } else if (selectedModulo.getNumNivel() == 6) {
                    node56 = new DefaultTreeNode(selectedModulo.getDscModulo(), node5);
                } else if (selectedModulo.getNumNivel() == 7) {
                    node7 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);
                } else if (selectedModulo.getNumNivel() == 8) {
                    node78 = new DefaultTreeNode(selectedModulo.getDscModulo(), node7);
                }
            }
        } catch (EaoException ex) {
            Logger.getLogger(UsuarioBean.class.getName()).log(Level.SEVERE, null, ex);
        }

        return this.selectedUsuario;
    }

    public String getPassword1() {
        return password1;
    }

    public void setPassword1(String password1) {
        this.password1 = password1;
    }

    public String getPassword2() {
        return password2;
    }

    public void setPassword2(String password2) {
        this.password2 = password2;
    }

    public boolean isDisable1() {
        return disable1;
    }

    public void setDisable1(boolean disable1) {
        this.disable1 = disable1;
    }

    public boolean isDisable2() {
        return disable2;
    }

    public void setDisable2(boolean disable2) {
        this.disable2 = disable2;
    }

    public void mostraButton(ActionEvent actionEvent) {
        this.disable1 = false;
        this.disable2 = true;
    }

    public boolean verifica_campos() throws NoSuchAlgorithmException {
        boolean lReturn = true;

        if (password1.isEmpty() || !password1.equals(password2)) {
            lReturn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Senha Incorreta! ", "");
        } else if (selectedUsuario.getNomUsuario().isEmpty()) {
            lReturn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Nome do Usuário em Branco! ", "");
        } else if (selectedUsuario.getUsrName().isEmpty()) {
            lReturn = false;
            msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "ATENÇÃO ... Login do Usuário em Branco! ", "");
        }

        if (lReturn) {
            selectedUsuario.setUsrPassword(funcoes.criptografaSenha(password1));
        }
        return lReturn;
    }

    public TreeNode getRoot() {
        return root;
    }

    public void setRoot(TreeNode root) {
        this.root = root;
    }

    public TreeNode getSelectedNode() {
        return selectedNode;
    }

    public void setSelectedNode(TreeNode selectedNode) {
        this.selectedNode = selectedNode;
    }

    public TreeNode[] getSelectedNodes() {
        return selectedNodes;
    }

    public void setSelectedNodes(TreeNode[] selectedNodes) {
        this.selectedNodes = selectedNodes;
    }

    public void mostraModulo(ValueChangeEvent event) {
        String cTipUsuario = event.getNewValue().toString();

        if (cTipUsuario.equals("Usuário Normal")) {
            this.disableModulo = true;
        } else {
            this.disableModulo = false;
            root.setSelected(true);
        }



        PhaseId phaseId = event.getPhaseId();

        if (phaseId.equals(PhaseId.ANY_PHASE)) {
            event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
            event.queue();
        }
    }

    public boolean isDisableModulo() {
        return disableModulo;
    }

    public void setDisableModulo(boolean disableModulo) {
        this.disableModulo = disableModulo;
    }

    public void onSelectRowCliente(SelectEvent event) throws EaoException {
        this.selectedUsuario = new Usuario();

        this.selectedUsuario = (Usuario) event.getObject();

        try {
            cSql = "id_usuario = " + this.selectedUsuario.getIdUsuario().toString();
            List<UsuarioModulo> listUsuarioModulo = UsuarioModuloJpa.getNative("UsuarioModulo", 0, moduloJpa.getCount("Modulo"), null, true, null, null, cSql);

            listModulo = moduloJpa.getNative("Modulo", 0, moduloJpa.getCount("Modulo"), "numNivel", true, null, null, null);

            root = new DefaultTreeNode("Root", null);
            TreeNode node1 = null;
            TreeNode node12 = null;
            TreeNode node3 = null;
            TreeNode node34 = null;
            TreeNode node5 = null;
            TreeNode node56 = null;
            TreeNode node7 = null;
            TreeNode node78 = null;

            for (int i = 0; i < listModulo.size(); i++) {
                selectedModulo = listModulo.get(i);

                if (selectedModulo.getNumNivel() == 1) {
                    node1 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);

                    for (int j = 0; j < listUsuarioModulo.size(); j++) {
                        selectedUsuarioModulo = listUsuarioModulo.get(j);
                        CheckModulo = node1.getData().equals(selectedUsuarioModulo.getModulo().getDscModulo());
                        node1.setSelected(CheckModulo);
                        if (CheckModulo) {
                            break;
                        }
                    }
                    root.setParent(node1);
                    root.setSelected(CheckModulo);
                } else if (selectedModulo.getNumNivel() == 2) {
                    node12 = new DefaultTreeNode(selectedModulo.getDscModulo(), node1);

                    for (int j = 0; j < listUsuarioModulo.size(); j++) {
                        selectedUsuarioModulo = listUsuarioModulo.get(j);
                        CheckModulo = node12.getData().equals(selectedUsuarioModulo.getModulo().getDscModulo());
                        node12.setSelected(CheckModulo);
                        if (CheckModulo) {
                            break;
                        }
                    }
                    node1.setParent(node12);
                    node1.setSelected(CheckModulo);
                    root.setParent(node1);
                    root.setSelected(CheckModulo);
                } else if (selectedModulo.getNumNivel() == 3) {
                    node3 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);

                    for (int j = 0; j < listUsuarioModulo.size(); j++) {
                        selectedUsuarioModulo = listUsuarioModulo.get(j);
                        CheckModulo = node3.getData().equals(selectedUsuarioModulo.getModulo().getDscModulo());
                        node3.setSelected(CheckModulo);
                        if (CheckModulo) {
                            break;
                        }
                    }
                    root.setParent(node3);
                    root.setSelected(CheckModulo);
                } else if (selectedModulo.getNumNivel() == 4) {
                    node34 = new DefaultTreeNode(selectedModulo.getDscModulo(), node3);

                    for (int j = 0; j < listUsuarioModulo.size(); j++) {
                        selectedUsuarioModulo = listUsuarioModulo.get(j);
                        CheckModulo = node34.getData().equals(selectedUsuarioModulo.getModulo().getDscModulo());
                        node34.setSelected(CheckModulo);
                        if (CheckModulo) {
                            break;
                        }
                    }
                    node3.setParent(node12);
                    node3.setSelected(CheckModulo);
                } else if (selectedModulo.getNumNivel() == 5) {
                    node5 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);

                    for (int j = 0; j < listUsuarioModulo.size(); j++) {
                        selectedUsuarioModulo = listUsuarioModulo.get(j);
                        CheckModulo = node5.getData().equals(selectedUsuarioModulo.getModulo().getDscModulo());
                        node5.setSelected(CheckModulo);
                        if (CheckModulo) {
                            break;
                        }
                    }
                    root.setParent(node5);
                    root.setSelected(CheckModulo);
                } else if (selectedModulo.getNumNivel() == 6) {
                    node56 = new DefaultTreeNode(selectedModulo.getDscModulo(), node5);

                    for (int j = 0; j < listUsuarioModulo.size(); j++) {
                        selectedUsuarioModulo = listUsuarioModulo.get(j);
                        CheckModulo = node56.getData().equals(selectedUsuarioModulo.getModulo().getDscModulo());
                        node56.setSelected(CheckModulo);
                        if (CheckModulo) {
                            break;
                        }
                    }
                    node5.setParent(node12);
                    node5.setSelected(CheckModulo);
                } else if (selectedModulo.getNumNivel() == 7) {
                    node7 = new DefaultTreeNode(selectedModulo.getDscModulo(), root);

                    for (int j = 0; j < listUsuarioModulo.size(); j++) {
                        selectedUsuarioModulo = listUsuarioModulo.get(j);
                        CheckModulo = node7.getData().equals(selectedUsuarioModulo.getModulo().getDscModulo());
                        node7.setSelected(CheckModulo);
                        if (CheckModulo) {
                            break;
                        }
                    }
                    root.setParent(node7);
                    root.setSelected(CheckModulo);
                } else if (selectedModulo.getNumNivel() == 8) {
                    node78 = new DefaultTreeNode(selectedModulo.getDscModulo(), node7);

                    for (int j = 0; j < listUsuarioModulo.size(); j++) {
                        selectedUsuarioModulo = listUsuarioModulo.get(j);
                        CheckModulo = node78.getData().equals(selectedUsuarioModulo.getModulo().getDscModulo());
                        node78.setSelected(CheckModulo);
                        if (CheckModulo) {
                            break;
                        }
                    }
                    node7.setParent(node12);
                    node7.setSelected(CheckModulo);
                }
                root.setSelected(CheckModulo);
            }
            password1 = "";
            password2 = "";
        } catch (EaoException ex) {
            Logger.getLogger(UsuarioBean.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
